package PenTest.Soluation4;

import java.util.Scanner;


/**
 * Created with IntelliJ IDEA.
 * Description:
 * User:周次煜
 * Date: 2024-07-18
 * Time：19:21
 */
public class Soluation4 {
}




 class Solution {

    int row ;
    int col ;
    int index ;

    // boolean[][] check;


     /**
      * 题目： 单词搜索
      *
      * 1. 都把对应的字符串转化为 字符二维数组
      * 2. 遍历每个字符，先找到单词的起始位置
      * 3. 根据起始位置进行递归的上下左右 的搜索
      * 4. 只要一遇到true 就开始返回布尔值 进行剪枝。
      * 利用上下左右的递归思想进行搜索
      *
      * @param board
      * @param word
      * @return
      */
    public boolean exist (String[] board, String word) {
        // write code here
        index = 1;
        row = board.length;
        col = board[0].length();
        int wlen = word.length();



        char[][] strs = new char[row][col];
        // check = new boolean[row][col];

//        把每个字符进行拷贝
        for (int i = 0; i < row; i++) {
            strs[i] = board[i].toCharArray();
        }

//        遍历每个元素
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col ; j++) {
                if (board[i].charAt(j) == word.charAt(0)  &&
                        dfs(  strs ,word.toCharArray(), i, j))   return true;
            }
        }


        return false;
    }

    public boolean dfs(char[][] strs, char[] word, int i, int j) {
        // 递归出口
        if (index == word.length) {
            return true;
        }



        // 开始深搜
        // 上
        if (checkIndex(i - 1, j) && strs[i - 1][j] == word[index]) {
//            走过的修改掉
            strs[i][j] = '#';
            index++;
            if ( dfs(strs, word, i - 1, j))  return true;

            index--;
        }
        // 下
        if (checkIndex(i + 1, j) && strs[i + 1][j] == word[index]) {
            strs[i][j] = '#';
            index++;
            if ( dfs(strs, word, i + 1, j))  return true;

            index--;
        }

        // 左
        if (checkIndex(i, j - 1) && strs[i ][j - 1 ] == word[index]) {
            strs[i][j] = '#';
            index++;
            if ( dfs(strs, word, i, j - 1))  return true;

            index--;
        }

        // 右
        if (checkIndex(i, j + 1) && strs[i ][j + 1] == word[index]) {
            strs[i][j] = '#';
            index++;
            if ( dfs(strs, word, i, j + 1))  return true;

            index--;
        }


//        如果都没有就返回false
        return false;
    }


    public boolean checkIndex(int x, int y) {
        return  (x >= 0 && x < row && y >= 0 && y <  col) ;
    }



}


/**
 * 题目： 斐波那契数列2
 * 1. 遍历 n 个长度大小的
 * 2. 用math 找到距离最小的即可
 */



// 注意类名必须为 Main, 不要有任何 package xxx 信息
class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别

        int n = in.nextInt();

//        处理特殊情况
        if(n==1) {
            System.out.println(0);
            return ;
        }

//        申请动态规划的空间
//        注意数字范围越界情况 用 long 表示

        long[] dp = new long[(n+(n/2))+1];
//        起始位置
        dp[0]=0;
        dp[1]=1;



//        初始化为最大值
        long len = Long.MAX_VALUE;

        // 进行遍历
        for(int i= 2; i <= (n+(n/2)); i++) {
            dp[i]= dp[i-1] + dp[i-2];

            len = Math.min(Math.abs(n-dp[i]), len);
        }

        System.out.println(len);

    }
}